package utils

// 字节码常量
const (
	OP_nop             byte = 0x00 // 0 None
	OP_aconst_null     byte = 0x01 // 1 将null推送至栈顶
	OP_iconst_m1       byte = 0x02 // 2 将int型-1推送至栈顶
	OP_iconst_0        byte = 0x03 // 3 将int型0推送至栈顶
	OP_iconst_1        byte = 0x04 // 4 将int型1推送至栈顶
	OP_iconst_2        byte = 0x05 // 5 将int型2推送至栈顶
	OP_iconst_3        byte = 0x06 // 6 将int型3推送至栈顶
	OP_iconst_4        byte = 0x07 // 7 将int型4推送至栈顶
	OP_iconst_5        byte = 0x08 // 8 将int型5推送至栈顶
	OP_lconst_0        byte = 0x09 // 9 将long型0推送至栈顶
	OP_lconst_1        byte = 0x0a // 10 将long型1推送至栈顶
	OP_fconst_0        byte = 0x0b // 11 将float型0推送至栈顶
	OP_fconst_1        byte = 0x0c // 12 "将float型1推送至栈顶	"
	OP_fconst_2        byte = 0x0d // 13 将float型2推送至栈顶
	OP_dconst_0        byte = 0x0e // 14 将double型0推送至栈顶
	OP_dconst_1        byte = 0x0f // 15 将double型1推送至栈顶
	OP_bipush          byte = 0x10 // 16 将单字节的常量值(-128~127)推送至栈顶
	OP_sipush          byte = 0x11 // 17 将一个短整型常量(-32768~32767)推送至栈顶
	OP_ldc             byte = 0x12 // 18 将int,float或String型常量值从常量池中推送至栈顶
	OP_ldc_w           byte = 0x13 // 19 将int,float或String型常量值从常量池中推送至栈顶(宽索引)
	OP_ldc2_w          byte = 0x14 // 20 将long或double型常量值从常量池中推送至栈顶(宽索引)
	OP_iload           byte = 0x15 // 21 将指定的int型本地变量推送至栈顶
	OP_lload           byte = 0x16 // 22 将指定的long型本地变量推送至栈顶
	OP_fload           byte = 0x17 // 23 将指定的float型本地变量推送至栈顶
	OP_dload           byte = 0x18 // 24 将指定的double型本地变量推送至栈顶
	OP_aload           byte = 0x19 // 25 将指定的引用类型本地变量推送至栈顶
	OP_iload_0         byte = 0x1a // 26 将第一个int型本地变量推送至栈顶
	OP_iload_1         byte = 0x1b // 27 将第二个int型本地变量推送至栈顶
	OP_iload_2         byte = 0x1c // 28 将第三个int型本地变量推送至栈顶
	OP_iload_3         byte = 0x1d // 29 将第四个int型本地变量推送至栈顶
	OP_lload_0         byte = 0x1e // 30 将第一个long型本地变量推送至栈顶
	OP_lload_1         byte = 0x1f // 31 将第二个long型本地变量推送至栈顶
	OP_lload_2         byte = 0x20 // 32 将第三个long型本地变量推送至栈顶
	OP_lload_3         byte = 0x21 // 33 将第四个long型本地变量推送至栈顶
	OP_fload_0         byte = 0x22 // 34 将第一个float型本地变量推送至栈顶
	OP_fload_1         byte = 0x23 // 35 将第二个float型本地变量推送至栈顶
	OP_fload_2         byte = 0x24 // 36 将第三个float型本地变量推送至栈顶
	OP_fload_3         byte = 0x25 // 37 将第四个float型本地变量推送至栈顶
	OP_dload_0         byte = 0x26 // 38 将第一个double型本地变量推送至栈顶
	OP_dload_1         byte = 0x27 // 39 将第二个double型本地变量推送至栈顶
	OP_dload_2         byte = 0x28 // 40 将第三个double型本地变量推送至栈顶
	OP_dload_3         byte = 0x29 // 41 将第四个double型本地变量推送至栈顶
	OP_aload_0         byte = 0x2a // 42 将第一个引用类型本地变量推送至栈顶
	OP_aload_1         byte = 0x2b // 43 将第二个引用类型本地变量推送至栈顶
	OP_aload_2         byte = 0x2c // 44 将第三个引用类型本地变量推送至栈顶
	OP_aload_3         byte = 0x2d // 45 将第四个引用类型本地变量推送至栈顶
	OP_iaload          byte = 0x2e // 46 将int型数组指定索引的值推送至栈顶
	OP_laload          byte = 0x2f // 47 将long型数组指定索引的值推送至栈顶
	OP_faload          byte = 0x30 // 48 将float型数组指定索引的值推送至栈顶
	OP_daload          byte = 0x31 // 49 将double型数组指定索引的值推送至栈顶
	OP_aaload          byte = 0x32 // 50 将引用类型数组指定索引的值推送至栈顶
	OP_baload          byte = 0x33 // 51 将boolean或byte型数组指定索引的值推送至栈顶
	OP_caload          byte = 0x34 // 52 将char型数组指定索引的值推送至栈顶
	OP_saload          byte = 0x35 // 53 将short型数组指定索引的值推送至栈顶
	OP_istore          byte = 0x36 // 54 将栈顶int型数值存入指定本地变量
	OP_lstore          byte = 0x37 // 55 将栈顶long型数值存入指定本地变量
	OP_fstore          byte = 0x38 // 56 将栈顶float型数值存入指定本地变量
	OP_dstore          byte = 0x39 // 57 将栈顶double型数值存入指定本地变量
	OP_astore          byte = 0x3a // 58 将栈顶引用类型数值存入指定本地变量
	OP_istore_0        byte = 0x3b // 59 将栈顶int型数值存入第一个本地变量
	OP_istore_1        byte = 0x3c // 60 将栈顶int型数值存入第二个本地变量
	OP_istore_2        byte = 0x3d // 61 将栈顶int型数值存入第三个本地变量
	OP_istore_3        byte = 0x3e // 62 将栈顶int型数值存入第四个本地变量
	OP_lstore_0        byte = 0x3f // 63 将栈顶long型数值存入第一个本地变量
	OP_lstore_1        byte = 0x40 // 64 将栈顶long型数值存入第二个本地变量
	OP_lstore_2        byte = 0x41 // 65 将栈顶long型数值存入第三个本地变量
	OP_lstore_3        byte = 0x42 // 66 将栈顶long型数值存入第四个本地变量
	OP_fstore_0        byte = 0x43 // 67 将栈顶float型数值存入第一个本地变量
	OP_fstore_1        byte = 0x44 // 68 将栈顶float型数值存入第二个本地变量
	OP_fstore_2        byte = 0x45 // 69 将栈顶float型数值存入第三个本地变量
	OP_fstore_3        byte = 0x46 // 70 将栈顶float型数值存入第四个本地变量
	OP_dstore_0        byte = 0x47 // 71 将栈顶double型数值存入第一个本地变量
	OP_dstore_1        byte = 0x48 // 72 将栈顶double型数值存入第二个本地变量
	OP_dstore_2        byte = 0x49 // 73 将栈顶double型数值存入第三个本地变量
	OP_dstore_3        byte = 0x4a // 74 将栈顶double型数值存入第四个本地变量
	OP_astore_0        byte = 0x4b // 75 将栈顶引用型数值存入第一个本地变量
	OP_astore_1        byte = 0x4c // 76 将栈顶引用型数值存入第二个本地变量
	OP_astore_2        byte = 0x4d // 77 将栈顶引用型数值存入第三个本地变量
	OP_astore_3        byte = 0x4e // 78 将栈顶引用型数值存入第四个本地变量
	OP_iastore         byte = 0x4f // 79 将栈顶int型数值存入指定数组的指定索引位置
	OP_lastore         byte = 0x50 // 80 将栈顶long型数值存入指定数组的指定索引位置
	OP_fastore         byte = 0x51 // 81 将栈顶float型数值存入指定数组的指定索引位置
	OP_dastore         byte = 0x52 // 82 将栈顶double型数值存入指定数组的指定索引位置
	OP_aastore         byte = 0x53 // 83 将栈顶引用型数值存入指定数组的指定索引位置
	OP_bastore         byte = 0x54 // 84 将栈顶boolean或byte型数值存入指定数组的指定索引位置
	OP_castore         byte = 0x55 // 85 将栈顶char型数值存入指定数组的指定索引位置
	OP_sastore         byte = 0x56 // 86 将栈顶short型数值存入指定数组的指定索引位置
	OP_pop             byte = 0x57 // 87 将栈顶数值弹出(数值不能是long或double类型的)
	OP_pop2            byte = 0x58 // 88 将栈顶的一个(对于非long或double类型)或两个数值(对于非long或double的其他类型)弹出
	OP_dup             byte = 0x59 // 89 复制栈顶数值并将复制值压入栈顶
	OP_dup_x1          byte = 0x5a // 90 复制栈顶数值并将两个复制值压入栈顶
	OP_dup_x2          byte = 0x5b // 91 复制栈顶数值并将三个(或两个)复制值压入栈顶
	OP_dup2            byte = 0x5c // 92 复制栈顶一个(对于long或double类型)或两个(对于非long或double的其他类型)数值并将复制值压入栈顶
	OP_dup2_x1         byte = 0x5d // 93 dup_x1指令的双倍版本
	OP_dup2_x2         byte = 0x5e // 94 dup_x2指令的双倍版本
	OP_swap            byte = 0x5f // 95 将栈顶最顶端的两个数值互换(数值不能是long或double类型)
	OP_iadd            byte = 0x60 // 96 将栈顶两int型数值相加并将结果压入栈顶
	OP_ladd            byte = 0x61 // 97 将栈顶两long型数值相加并将结果压入栈顶
	OP_fadd            byte = 0x62 // 98 将栈顶两float型数值相加并将结果压入栈顶
	OP_dadd            byte = 0x63 // 99 将栈顶两double型数值相加并将结果压入栈顶
	OP_isub            byte = 0x64 // 100 将栈顶两int型数值相减并将结果压入栈顶
	OP_lsub            byte = 0x65 // 101 将栈顶两long型数值相减并将结果压入栈顶
	OP_fsub            byte = 0x66 // 102 将栈顶两float型数值相减并将结果压入栈顶
	OP_dsub            byte = 0x67 // 103 将栈顶两double型数值相减并将结果压入栈顶
	OP_imul            byte = 0x68 // 104 将栈顶两int型数值相乘并将结果压入栈顶
	OP_lmul            byte = 0x69 // 105 将栈顶两long型数值相乘并将结果压入栈顶
	OP_fmul            byte = 0x6a // 106 将栈顶两float型数值相乘并将结果压入栈顶
	OP_dmul            byte = 0x6b // 107 将栈顶两double型数值相乘并将结果压入栈顶
	OP_idiv            byte = 0x6c // 108 将栈顶两int型数值相除并将结果压入栈顶
	OP_ldiv            byte = 0x6d // 109 将栈顶两long型数值相除并将结果压入栈顶
	OP_fdiv            byte = 0x6e // 110 将栈顶两float型数值相除并将结果压入栈顶
	OP_ddiv            byte = 0x6f // 111 将栈顶两double型数值相除并将结果压入栈顶
	OP_irem            byte = 0x70 // 112 将栈顶两int型数值作取模运算并将结果压入栈顶
	OP_lrem            byte = 0x71 // 113 将栈顶两long型数值作取模运算并将结果压入栈顶
	OP_frem            byte = 0x72 // 114 将栈顶两float型数值作取模运算并将结果压入栈顶
	OP_drem            byte = 0x73 // 115 将栈顶两double型数值作取模运算并将结果压入栈顶
	OP_ineg            byte = 0x74 // 116 将栈顶int型数值取负并将结果压入栈顶
	OP_lneg            byte = 0x75 // 117 将栈顶long型数值取负并将结果压入栈顶
	OP_fneg            byte = 0x76 // 118 将栈顶float型数值取负并将结果压入栈顶
	OP_dneg            byte = 0x77 // 119 将栈顶double型数值取负并将结果压入栈顶
	OP_ishl            byte = 0x78 // 120 将int型数值左移指定位数并将结果压入栈顶
	OP_lshl            byte = 0x79 // 121 将long型数值左移指定位数并将结果压入栈顶
	OP_ishr            byte = 0x7a // 122 将int型数值右(带符号)移指定位数并将结果压入栈顶
	OP_lshr            byte = 0x7b // 123 将long型数值右(带符号)移指定位数并将结果压入栈顶
	OP_iushr           byte = 0x7c // 124 将int型数值右(无符号)移指定位数并将结果压入栈顶
	OP_lushr           byte = 0x7d // 125 将long型数值右(无符号)移指定位数并将结果压入栈顶
	OP_iand            byte = 0x7e // 126 将栈顶两int型数值"按位与"并将结果压入栈顶
	OP_land            byte = 0x7f // 127 将栈顶两long型数值"按位与"并将结果压入栈顶
	OP_ior             byte = 0x80 // 128 将栈顶两int型数值"按位或"并将结果压入栈顶
	OP_lor             byte = 0x81 // 129 将栈顶两long型数值"按位或"并将结果压入栈顶
	OP_ixor            byte = 0x82 // 130 将栈顶两int型数值"按位异或"并将结果压入栈顶
	OP_lxor            byte = 0x83 // 131 将栈顶两long型数值"按位异或"并将结果压入栈顶
	OP_iinc            byte = 0x84 // 132 将指定int型变量增加指定值(如i++, i--, i+byte =2等)
	OP_i2l             byte = 0x85 // 133 将栈顶int型数值强制转换为long型数值并将结果压入栈顶
	OP_i2f             byte = 0x86 // 134 将栈顶int型数值强制转换为float型数值并将结果压入栈顶
	OP_i2d             byte = 0x87 // 135 将栈顶int型数值强制转换为double型数值并将结果压入栈顶
	OP_l2i             byte = 0x88 // 136 将栈顶long型数值强制转换为int型数值并将结果压入栈顶
	OP_l2f             byte = 0x89 // 137 将栈顶long型数值强制转换为float型数值并将结果压入栈顶
	OP_l2d             byte = 0x8a // 138 将栈顶long型数值强制转换为double型数值并将结果压入栈顶
	OP_f2i             byte = 0x8b // 139 将栈顶float型数值强制转换为int型数值并将结果压入栈顶
	OP_f2l             byte = 0x8c // 140 将栈顶float型数值强制转换为long型数值并将结果压入栈顶
	OP_f2d             byte = 0x8d // 141 将栈顶float型数值强制转换为double型数值并将结果压入栈顶
	OP_d2i             byte = 0x8e // 142 将栈顶double型数值强制转换为int型数值并将结果压入栈顶
	OP_d2l             byte = 0x8f // 143 将栈顶double型数值强制转换为long型数值并将结果压入栈顶
	OP_d2f             byte = 0x90 // 144 将栈顶double型数值强制转换为float型数值并将结果压入栈顶
	OP_i2b             byte = 0x91 // 145 将栈顶int型数值强制转换为byte型数值并将结果压入栈顶
	OP_i2c             byte = 0x92 // 146 将栈顶int型数值强制转换为char型数值并将结果压入栈顶
	OP_i2s             byte = 0x93 // 147 将栈顶int型数值强制转换为short型数值并将结果压入栈顶
	OP_lcmp            byte = 0x94 // 148 比较栈顶两long型数值大小, 并将结果(1, 0或-1)压入栈顶
	OP_fcmpl           byte = 0x95 // 149 比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
	OP_fcmpg           byte = 0x96 // 150 比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
	OP_dcmpl           byte = 0x97 // 151 比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
	OP_dcmpg           byte = 0x98 // 152 比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
	OP_ifeq            byte = 0x99 // 153 当栈顶int型数值等于0时跳转
	OP_ifne            byte = 0x9a // 154 当栈顶int型数值不等于0时跳转
	OP_iflt            byte = 0x9b // 155 当栈顶int型数值小于0时跳转
	OP_ifge            byte = 0x9c // 156 当栈顶int型数值大于等于0时跳转
	OP_ifgt            byte = 0x9d // 157 当栈顶int型数值大于0时跳转
	OP_ifle            byte = 0x9e // 158 当栈顶int型数值小于等于0时跳转
	OP_if_icmpeq       byte = 0x9f // 159 比较栈顶两int型数值大小, 当结果等于0时跳转
	OP_if_icmpne       byte = 0xa0 // 160 比较栈顶两int型数值大小, 当结果不等于0时跳转
	OP_if_icmplt       byte = 0xa1 // 161 比较栈顶两int型数值大小, 当结果小于0时跳转
	OP_if_icmpge       byte = 0xa2 // 162 比较栈顶两int型数值大小, 当结果大于等于0时跳转
	OP_if_icmpgt       byte = 0xa3 // 163 比较栈顶两int型数值大小, 当结果大于0时跳转
	OP_if_icmple       byte = 0xa4 // 164 比较栈顶两int型数值大小, 当结果小于等于0时跳转
	OP_if_acmpeq       byte = 0xa5 // 165 比较栈顶两引用型数值, 当结果相等时跳转
	OP_if_acmpne       byte = 0xa6 // 166 比较栈顶两引用型数值, 当结果不相等时跳转
	OP_goto            byte = 0xa7 // 167 无条件跳转
	OP_jsr             byte = 0xa8 // 168 跳转至指定的16位offset位置, 并将jsr的下一条指令地址压入栈顶
	OP_ret             byte = 0xa9 // 169 返回至本地变量指定的index的指令位置(一般与jsr或jsr_w联合使用)
	OP_tableswitch     byte = 0xaa // 170 用于switch条件跳转, case值连续(可变长度指令)
	OP_lookupswitch    byte = 0xab // 171 用于switch条件跳转, case值不连续(可变长度指令)
	OP_ireturn         byte = 0xac // 172 从当前方法返回int
	OP_lreturn         byte = 0xad // 173 从当前方法返回long
	OP_freturn         byte = 0xae // 174 从当前方法返回float
	OP_dreturn         byte = 0xaf // 175 从当前方法返回double
	OP_areturn         byte = 0xb0 // 176 从当前方法返回对象引用
	OP_return          byte = 0xb1 // 177 从当前方法返回void
	OP_getstatic       byte = 0xb2 // 178 获取指定类的静态域, 并将其压入栈顶
	OP_putstatic       byte = 0xb3 // 179 为指定类的静态域赋值
	OP_getfield        byte = 0xb4 // 180 获取指定类的实例域, 并将其压入栈顶
	OP_putfield        byte = 0xb5 // 181 为指定类的实例域赋值
	OP_invokevirtual   byte = 0xb6 // 182 调用实例方法
	OP_invokespecial   byte = 0xb7 // 183 调用超类构造方法, 实例初始化方法, 私有方法
	OP_invokestatic    byte = 0xb8 // 184 调用静态方法
	OP_invokeinterface byte = 0xb9 // 185 调用接口方法
	OP_invokedynamic   byte = 0xba // 186 调用动态方法
	OP_new             byte = 0xbb // 187 创建一个对象, 并将其引用引用值压入栈顶
	OP_newarray        byte = 0xbc // 188 创建一个指定的原始类型(如int, float, char等)的数组, 并将其引用值压入栈顶
	OP_anewarray       byte = 0xbd // 189 创建一个引用型(如类, 接口, 数组)的数组, 并将其引用值压入栈顶
	OP_arraylength     byte = 0xbe // 190 获取数组的长度值并压入栈顶
	OP_athrow          byte = 0xbf // 191 将栈顶的异常抛出
	OP_checkcast       byte = 0xc0 // 192 检验类型转换, 检验未通过将抛出 ClassCastException
	OP_instanceof      byte = 0xc1 // 193 检验对象是否是指定类的实际, 如果是将1压入栈顶, 否则将0压入栈顶
	OP_monitorenter    byte = 0xc2 // 194 获得对象的锁, 用于同步方法或同步块
	OP_monitorexit     byte = 0xc3 // 195 释放对象的锁, 用于同步方法或同步块
	OP_wide            byte = 0xc4 // 196 扩展本地变量的宽度
	OP_multianewarray  byte = 0xc5 // 197 创建指定类型和指定维度的多维数组(执行该指令时, 操作栈中必须包含各维度的长度值), 并将其引用压入栈顶
	OP_ifnull          byte = 0xc6 // 198 为null时跳转
	OP_ifnonnull       byte = 0xc7 // 199 不为null时跳转
	OP_goto_w          byte = 0xc8 // 200 无条件跳转(宽索引)
	OP_jsr_w           byte = 0xc9 // 201 跳转至指定的32位offset位置, 并将jsr_w的下一条指令地址压入栈顶
	OP_breakpoint      byte = 0xca // 202 保留，不会出现在class文件中，用于给调试器实现断点功能
	OP_impdep1         byte = 0xfe // 254 保留，不会出现在class文件中
	OP_impdep2         byte = 0xff // 255 保留，不会出现在class文件中
)
